home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
extras
/
programm
/
gemfsc20
/
gemfsc20.lzh
/
GNUGEM27
/
VDIINP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-24
|
8KB
|
365 lines
/*
* Vdi input funcs library interface
*
* vsin_mode set input mode
* vrq_locator input locator blocking
* vsm_locator input locator non-blocking
* vrq_valuator get vauator blocking
* vsm_valuator sample valuator non-blocking
* vrq_choice request choice blocking
* vsm_choice request choice non-blocking
* vrq_string get string blocking
* vsm_string get string non block
* vsc_form set mouse form
* vex_timv exchange timer interrupt vector
* v_show_c show cursor
* v_hide_c show hide
* vex_butv exchange button vector
* vex_motv exchange mouse movement vector
* vex_curv exchange cursor change vector
* vq_key_s sample kbd state
*
* ++jrb bammi@cadence.com
* modified: mj -- ntomczak@vm.ucs.ualberta.ca
*
* whoever at atari/dri designed this part was
* definitely *not* on over-the-counter drugs
*
*/
#include "common.h"
#ifdef __DEF_ALL__
#define L_vsin_mod
#define L_vsm_loca /* provides also vrq_locator */
#define L_vrq_valu
#define L_vsm_valu
#define L_vrq_choi
#define L_vsm_choi
#define L_vsm_stri /* provides also vrq_string */
#define L_vsc_form
#define L_vex_timv
#define L_v_show_c
#define L_v_hide_c
#define L_vq_mouse
#define L_vex_butv
#define L_vex_motv
#define L_vex_curv
#define L_vq_key_s
#endif /* __DEF_ALL__ */
#ifdef L_vsin_mod
/* vsin_mode set input mode
* returns input mode
*/
int vsin_mode(int handle, int dev, int mode)
{
_intin[0] = dev;
_intin[1] = mode;
__vdi__(VDI_CONTRL_ENCODE(33, 0, 2, 0), handle);
return (int)_intout[0];
}
#endif /* L_vsin_mod */
/* vrq_locator input locator (blocking)
* returns void (results in args)
*/
#ifdef L_vsm_loca
__asm__(".stabs \"_vrq_locator\",5,0,0,_vsm_locator");
/* dept of clean tricks */
/* vsm_locator input locator non-blocking
* returns coded message
* 1 coordinates changed
* 2 key pressed coordinates not changed
* 3 key pressed coordinates changed
* 0 no input
*/
int vsm_locator(int handle, int x, int y,
int *xout, int *yout, int *term)
{
_ptsin[0] = x;
_ptsin[1] = y;
__vdi__(VDI_CONTRL_ENCODE(28, 1, 0, 0), handle);
*xout = _ptsout[0];
*yout = _ptsout[1];
*term = _intout[0];
/* ignore return value for vrq_locator */
return (int)((_contrl[4] << 1) | _contrl[2]);
}
#endif /* L_vsm_loca */
#ifdef L_vrq_valu
/* vrq_valuator get valuator blocking
* returns void (results in args)
*/
void vrq_valuator(int handle, int in,
int *out, int *term)
{
_intin[0] = in;
__vdi__(VDI_CONTRL_ENCODE(29, 0, 1, 0), handle);
*out = _intout[0];
*term = _intout[1];
}
#endif /* L_vrq_valu */
#ifdef L_vsm_valu
/* vsm_valuator sample valuator (non-block)
* returns void (results in args)
*/
void vsm_valuator(int handle, int in,
int *out, int *term, int *status)
{
_intin[0] = in;
__vdi__(VDI_CONTRL_ENCODE(29, 0, 1, 0), handle);
*out = _intout[0];
*term = _intout[1];
*status = _contrl[4];
}
#endif /* L_vsm_valu */
#ifdef L_vrq_choi
/* vrq_choice request choice blocking
* returns void (result in arg)
*/
void vrq_choice(int handle, int cin, int *cout)
{
_intin[0] = cin;
__vdi__(VDI_CONTRL_ENCODE(30, 0, 1, 0), handle);
*cout = _intout[0];
}
#endif /* L_vrq_choi */
#ifdef L_vsm_choi
/* vsm_choice request choice (non-block)
* returns status and choice in arg
*/
int vsm_choice(int handle, int *choice)
{
__vdi__(VDI_CONTRL_ENCODE(30, 0, 0, 0), handle);
*choice = _intout[0];
return (int)_contrl[4];
}
#endif /* L_vsm_choi */
#ifdef L_vsm_stri
/* vrq_string get string blocking
* returns void (string in arg)
* void vrq_string(int handle, int len, int echo, int echoxy[], char *str)
*/
__asm__(".stabs \"_vrq_string\",5,0,0,_vsm_string"); /* dept of clean tricks */
/* vsm_string get string non block
* returns 0 no chars avail >0 chars avail
*
* The code below does not use VDI_CONTRL_ENCODE macro since
* len can be a negative number.
*/
/*
* Both functions will handle strings up to INTINMAX characters in
* length (currently 255). Note that if length is specified as
* a negative number then scan codes are available after a call
* in _intin[] array (not _intout! - this binding temporarily
* switches roles of _intin and _intout).
*/
int vsm_string(int handle, int len, int echo, int echoxy[], char *str)
{
short status;
short *end, *wptr = _intout;
/* Switch roles of _intin and _intout */
_vdiparams[1] = (void *)wptr;
_vdiparams[3] = (void *)&_intin[0];
*wptr++ = len;
*wptr++ = echo;
wptr = (short *)_contrl;
*wptr++ = 31; /* 0 - opcode */
*wptr++ = 1; /* 1 */
wptr++; /* 2 */
*wptr = 2; /* 3 - # of entries in _intout (this time) */
wptr[3] = handle; /* 6 - handle */
vdi(); /* call vdi */
status = _contrl[4];
wptr = _intin;
end = wptr + status;
while (wptr < end)
*str++ = *wptr++;
*str = '\0';
/* Restore usual meaning of _intin and _intout */
_vdiparams[1] = (void *)&_intin[0];
_vdiparams[3] = (void *)&_intout[0];
return (int) status; /* not used by vrq_string */
}
#endif /* L_vsm_stri */
#ifdef L_vsc_form
/* vsc_form set mouse form
* returns void
*/
void vsc_form(int handle, int form[])
{
#ifdef __MSHORT__
_vdiparams[1] = &form[0];
#else
int *end = form + 37;
short *wptr = _intin;
do {
*wptr++ = *form++;
} while (form < end);
#endif
__vdi__(VDI_CONTRL_ENCODE(111, 0, 37, 0), handle);
#ifdef __MSHORT__
_vdiparams[1] = (void *)&_intin[0];
#endif
}
#endif /* L_vsc_form */
#ifdef L_vex_timv
/* vex_timv exchange timer interrupt vector
* returns void (results in args)
*/
void vex_timv(int handle, void *time_addr,
void **otime_addr, int *time_conv)
{
*((void **)(&_contrl[7])) = time_addr;
__vdi__(VDI_CONTRL_ENCODE(118, 0, 0, 0), handle);
*otime_addr = *((void **)(&_contrl[9]));
*time_conv = _intout[0];
}
#endif /* L_vex_timv */
#ifdef L_v_show_c
/* v_show_c show cursor
* returns void
*/
void v_show_c(int handle, int reset)
{
_intin[0] = reset;
__vdi__(VDI_CONTRL_ENCODE(122, 0, 1, 0), handle);
}
#endif /* L_v_show_c */
#ifdef L_v_hide_c
/* v_hide_c show hide
* returns void
*/
void v_hide_c(int handle)
{
__vdi__(VDI_CONTRL_ENCODE(123, 0, 0, 0), handle);
}
#endif /* L_v_hide_c */
#ifdef L_vq_mouse
/* vq_mouse sample mouse button state
* returns void (results in args
*/
void vq_mouse(int handle, int *pstatus, int *x, int *y)
{
__vdi__(VDI_CONTRL_ENCODE(124, 0, 0, 0), handle);
*pstatus = _intout[0];
*x = _ptsout[0];
*y = _ptsout[1];
}
#endif /* L_vq_mouse */
#ifdef L_vex_butv
/* vex_butv exchange button vector
* returns void (results in args)
*/
void vex_butv(int handle, void *new, void **old)
{
*((void **)(&_contrl[7])) = new;
__vdi__(VDI_CONTRL_ENCODE(125, 0, 0, 0), handle);
*old = *((void **)(&_contrl[9]));
}
#endif /* L_vex_butv */
#ifdef L_vex_motv
/* vex_motv exchange mouse movement vector
* returns void (result in arg)
*/
void vex_motv(int handle, void *new, void **old)
{
*((void **)(&_contrl[7])) = new;
__vdi__(VDI_CONTRL_ENCODE(126, 0, 0, 0), handle);
*old = *((void **)(&_contrl[9]));
}
#endif /* L_vex_motv */
#ifdef L_vex_curv
/* vex_curv exchange cursor change vector
* returns void (result in arg)
*/
void vex_curv(int handle, void *new, void **old)
{
*((void **)(&_contrl[7])) = new;
__vdi__(VDI_CONTRL_ENCODE(127, 0, 0, 0), handle);
*old = *((void **)(&_contrl[9]));
}
#endif /* L_vex_curv */
#ifdef L_vq_key_s
/* vq_key_s sample kbd state
* returns void (result in arg)
*/
void vq_key_s(int handle, int *state)
{
__vdi__(VDI_CONTRL_ENCODE(128, 0, 0, 0), handle);
*state = _intout[0];
}
#endif /* L_vq_key_s */
/* -eof- */